package com.gewu.pm.utils;

import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 金额输入帮助类
 * 用于限制金额输入框只能输入指定位数的小数
 *
 * 主要特性
 * ✅ 限制小数位数：最多只能输入指定位数的小数（默认2位）
 * ✅ 自动处理开头的0：输入 01 会自动变成 1，但 0.1 保持不变
 * ✅ 自动补0：输入 .5 会自动变成 0.5
 * ✅ 防止非法输入：超过小数位数的输入会被自动阻止
 * ✅ 实时监听：在用户输入时实时校验和限制
 *
 * 在其他页面使用
 * 现在任何需要金额输入限制的页面，只需要一行代码：
 * // 在 initView() 或 initData() 中添加
 * MoneyInputHelper.setMoneyInput(你的金额EditText);
 *
 * 如果需要不同的小数位数：
 * MoneyInputHelper.setMoneyInput(你的金额EditText, 3);  // 限制3位小数
 */
public class MoneyInputHelper {

    /**
     * 为 EditText 设置金额输入限制（默认最多2位小数）
     * @param editText 需要限制的输入框
     */
    public static void setMoneyInput(EditText editText) {
        setMoneyInput(editText, 2);
    }

    /**
     * 为 EditText 设置金额输入限制
     * @param editText 需要限制的输入框
     * @param decimalDigits 小数位数限制（例如：2表示最多2位小数）
     */
    public static void setMoneyInput(EditText editText, int decimalDigits) {
        editText.addTextChangedListener(new MoneyTextWatcher(editText, decimalDigits));
    }

    /**
     * 金额输入监听器
     */
    private static class MoneyTextWatcher implements TextWatcher {
        
        private final EditText editText;
        private final int decimalDigits;
        private String beforeText = "";

        public MoneyTextWatcher(EditText editText, int decimalDigits) {
            this.editText = editText;
            this.decimalDigits = decimalDigits;
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            beforeText = s.toString();
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            String input = s.toString();
            
            // 如果输入为空，直接返回
            if (input.isEmpty()) {
                return;
            }

            // 删除开头的多个0（但保留"0"和"0."的情况）
            if (input.startsWith("0") && input.length() > 1 && !input.startsWith("0.")) {
                editText.removeTextChangedListener(this);
                editText.setText(input.substring(1));
                editText.setSelection(editText.getText().length());
                editText.addTextChangedListener(this);
                return;
            }

            // 正则表达式：整数部分任意位，小数部分最多指定位数
            String regex = "^\\d+(\\.\\d{0," + decimalDigits + "})?$";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(input);

            // 如果输入不符合规则
            if (!matcher.matches()) {
                // 如果只输入了小数点
                if (input.equals(".")) {
                    editText.removeTextChangedListener(this);
                    editText.setText("0.");
                    editText.setSelection(editText.getText().length());
                    editText.addTextChangedListener(this);
                    return;
                }

                // 如果小数位数超出限制，恢复到之前的内容
                if (input.contains(".")) {
                    String[] parts = input.split("\\.");
                    if (parts.length == 2 && parts[1].length() > decimalDigits) {
                        editText.removeTextChangedListener(this);
                        editText.setText(beforeText);
                        editText.setSelection(beforeText.length());
                        editText.addTextChangedListener(this);
                        return;
                    }
                }

                // 其他不符合规则的情况，恢复到之前的内容
                editText.removeTextChangedListener(this);
                editText.setText(beforeText);
                editText.setSelection(beforeText.length());
                editText.addTextChangedListener(this);
            }
        }
    }

    /**
     * 验证金额格式是否正确
     * @param amount 金额字符串
     * @param decimalDigits 小数位数限制
     * @return true-格式正确，false-格式错误
     */
    public static boolean isValidMoney(String amount, int decimalDigits) {
        if (amount == null || amount.isEmpty()) {
            return false;
        }
        String regex = "^\\d+(\\.\\d{1," + decimalDigits + "})?$";
        return amount.matches(regex);
    }

    /**
     * 验证金额格式是否正确（默认2位小数）
     * @param amount 金额字符串
     * @return true-格式正确，false-格式错误
     */
    public static boolean isValidMoney(String amount) {
        return isValidMoney(amount, 2);
    }

    /**
     * 格式化金额显示（保留指定小数位）
     * @param amount 金额
     * @param decimalDigits 小数位数
     * @return 格式化后的金额字符串
     */
    public static String formatMoney(double amount, int decimalDigits) {
        return String.format("%." + decimalDigits + "f", amount);
    }

    /**
     * 格式化金额显示（保留2位小数）
     * @param amount 金额
     * @return 格式化后的金额字符串
     */
    public static String formatMoney(double amount) {
        return formatMoney(amount, 2);
    }
}

